/*
 ============================================================================
 Name        : MaxCut1.c
 Author      :
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Util.h"
#include "Lector.h"
#include "Heuristicas.h"

int* solucion;

void printUsage() {
	printf("Usage: ");
	printf("<Numero de nodos>, <[(),(),(),(),...,()]>");
	exit(0);
}

void opciones(short int *opcion1, short int *opcion2) {

	leerAlgoritmo();
	if (strcmp(algoritmo,"LSM") == 0) {
		*opcion2 = 1;
	} else if (strcmp(algoritmo, "LSP") == 0) {
		*opcion2 = 2;
	} else if (strcmp(algoritmo, "SMA") == 0) {
		*opcion2 = 3;
	} else if (strcmp(algoritmo, "GRS") == 0) {
		*opcion2 = 4;
	} else if (strcmp(algoritmo, "LIS") == 0) {
		*opcion2 = 5;
	} else if (strcmp(algoritmo, "TBU") == 0) {
		*opcion2 = 6;
	} else *opcion2 = -1;

	leerSolInic();
	if (strcmp(solInic,"GREEDY") == 0) {
		*opcion1 = 1;
	} else if (strcmp(solInic, "RND") == 0) {
		*opcion1 = 2;
	} else *opcion1 = -1;
}

int main(int argc, char**argv) {
	int **conexiones;
	int cola = 0;
	int valorSol = 0;
	short int opcion1 = 0;
	short int opcion2 = 0;

	//Leo el parametro de entrada y creo el espacio para la solucion
	conexiones = leerInput();
	opciones(&opcion1, &opcion2); //Escogo que heuristicas aplicar

	solucion = malloc(sizeof(int) * NODOS);
	generarTabla(conexiones, NODOS);

	PlantSeeds(-1); //Planto la semilla para cualquiera que sea el random a usar

	// Genero la solucion inicial. Depende del tipo de eleccion se obtendra
	// una solucion distinta. Luego aplico la busqueda local
	switch (opcion2) {
	case 1:
		if (!opcion1)
			printUsage();
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		busquedaLocalMM(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	case 2:
		if (!opcion1)
			printUsage();
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		busquedaLocalPM(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	case 3:
		printf("No esta implementado SIMULATED ANNEALING\n");
		break;
	case 4:
		if (!opcion1)
			printUsage();
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		grasp(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	case 5:
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		lis(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	case 6:
		if (!opcion1) printUsage();
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		tabu(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	case 7:
		generarSol(conexiones, NODOS, solucion, &cola, &valorSol, opcion1);
		printf("valor de la solucion Inicial: %d\n", valorSol);
		busquedaLocalSM(conexiones, NODOS, solucion, &cola, &valorSol);
		break;
	default:
		printUsage(); //Se termina el programa en esta llamada
	}

	printf("valor de la solucion: %d\n", valorSol);
	//printf("tamano de la solucion %d\n", cola);
	//printf("termine\n");
	return EXIT_SUCCESS;
}

